#include<iostream>
#include<pthread.h>
#include<unistd.h>

using namespace std;

//死锁示例

// pthread_mutex_t mutexA = PTHREAD_MUTEX_INITIALIZER;
// pthread_mutex_t mutexB = PTHREAD_MUTEX_INITIALIZER;

// void* func1(void* argc)
// {
//     pthread_mutex_lock(&mutexA);
//     sleep(1);
//     pthread_mutex_lock(&mutexB);
//     cout<<"tid1: "<<pthread_self()<<"run……"<<endl;
//     pthread_mutex_unlock(&mutexA);
//     pthread_mutex_unlock(&mutexB);
// }

// void* func2(void* argc)
// {
//     pthread_mutex_lock(&mutexB);
//     sleep(1);
//     pthread_mutex_lock(&mutexA);
//     cout<<"tid2: "<<pthread_self()<<"run……"<<endl;
//     pthread_mutex_unlock(&mutexB);
//     pthread_mutex_unlock(&mutexA);
// }

// int main()
// {
//     pthread_t tid1,tid2;
    
//     pthread_create(&tid1,nullptr,func1,nullptr);
//     pthread_create(&tid2,nullptr,func2,nullptr);


//     pthread_join(tid1,nullptr);
//     pthread_join(tid2,nullptr);

//     return 0;
// }


// 线程同步示例

pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t mycond = PTHREAD_COND_INITIALIZER;

bool quit=false;

void* func(void* argc)
{
    while(!quit)
    {
        pthread_cond_wait(&mycond,&mymutex);
        cout<<"tid "<<pthread_self()<<": running ……"<<endl;
    }
    pthread_mutex_unlock(&mymutex);
    cout<<"tid "<<pthread_self()<<": quit ……"<<endl;
    
}

int main()
{
    pthread_t tid1,tid2,tid3;
    pthread_create(&tid1,nullptr,func,nullptr);
    pthread_create(&tid2,nullptr,func,nullptr);
    pthread_create(&tid3,nullptr,func,nullptr);

    while(true)
    {
        char commnd;
        cin>>commnd;
        if(commnd=='n')
        {
            pthread_cond_signal(&mycond);
        }
        else
        {
            quit=true;
            break;
        }
    }
    pthread_cond_broadcast(&mycond);
    pthread_join(tid1,nullptr);
    pthread_join(tid2,nullptr);
    pthread_join(tid3,nullptr);


    return 0;
}